window = global; // 为了兼容浏览器环境，将 Node.js 全局对象 `global` 赋值给 `window`

const JSEncrypt = require('jsencrypt'); // 引入 JSEncrypt 库，用于 RSA 加密
const CryptoJS = require('crypto-js');  // 引入 CryptoJS 库，用于 AES 加密

function yt(t) {
    t = t || {}; // 如果传入的参数 `t` 为空，则初始化为一个空对象

    // 生成一个 16 字节的随机字符串，用于 AES 加密的密钥
    var e = function (t) {
        for (var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*", i = "", r = 0; r < t; r++) {
            var n = Math.floor(Math.random() * e.length); // 随机选择字符
            i += e.substring(n, n + 1);                   // 构建随机字符串
        }
        return i;
    }(16);

    // 创建一个 JSEncrypt 实例，用于 RSA 加密
    var i = new JSEncrypt({});

    // 设置 RSA 公钥，用于加密随机密钥 `e`
    i.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYEVrK/4Mahiv0pUJgTybx4J9P5dUT/Y0PuwMbk+gMU+jrZnBiXGv6/hCH1avIhoBcE535F8nJQQN3UavZdFkYidsoXuEnat3+eVTp3FslyhRwIBDF09v4vDhRtxFOT+R7uH7h/mzmyA2/+lfIMWGIrffXprYizbV76+YQKhoqFQIDAQAB");

    // 使用 RSA 公钥加密 Base64 编码后的随机密钥 `e`
    // Base64 编码是将二进制数据转换为文本格式，便于传输
    var r = i.encrypt(window.btoa(e));

    // 定义 AES 加密的 IV（Initialization Vector），固定值
    var s = CryptoJS.enc.Utf8.parse("0102030405060708");

    // 将随机密钥 `e` 转换为 CryptoJS 的字节格式，用于 AES 加密
    var h = CryptoJS.enc.Utf8.parse(e);

    // 将输入对象 `t` 的键名列表通过 Base64 编码，用于后续加密结果的标识
    var u = window.btoa(Object.keys(t).join(","));

    var c = {}; // 初始化一个空对象，用于存储加密后的参数

    // 遍历输入对象 `t` 的每个键值对，进行 AES 加密
    return Object.keys(t).forEach((function (key) {
        var value = t[key]; // 获取当前键对应的值

        // 使用 AES 算法加密值，采用 CBC 模式、PKCS7 填充
        var encrypted = CryptoJS.AES.encrypt(value, h, {
            iv: s,       // 使用固定的 IV
            padding: CryptoJS.pad.Pkcs7 // 填充方式为 PKCS7
        });

        // 将加密结果转换为字符串形式
        var encryptedStr = encrypted.toString();

        // 将加密结果存储到 `c` 对象中，键为原键名
        c[key] = encryptedStr;
    })),
    {
        // 返回一个对象，包含加密后的信息：
        // EUI：包含 RSA 加密的随机密钥和键名列表
        // encryptedParams：包含 AES 加密后的参数
        EUI: "".concat(r, ".").concat(u), // 使用 `r` 和 `u` 构建 EUI，中间用 `.` 分隔
        encryptedParams: c               // 存储 AES 加密后的参数
    }
}

// 示例调用
const user = yt({'user': '123456'});
console.log(user)
const hash = CryptoJS.MD5('123456').toString()
console.log(hash)